--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/kivymd/uix/tab/tab.py 2dcc759c88f3f2471ffcf6146721200a16aadede (2dcc759c) Text, 67.73 KB
T8b949e"""
Components/Tabs
===============
.. seealso::
`Material Design spec, Tabs <https://material.io/components/tabs>`_
.. rubric:: Tabs organize content across different screens, data sets,
and other interactions.
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/tabs.png
:align: center
.. Note:: Module provides tabs in the form of icons or text.
Usage
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
To create a tab, you must create a new class that inherits from the
:class:`~MDTabsBase` class and the `Kivy` container, in which you will create
content for the tab.
.. code-block:: python
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
.. code-block:: kv
<Tab>
MDLabel:
text: root.content_text
pos_hint: {"center_x": .5, "center_y": .5}
All tabs must be contained inside a :class:`~MDTabs` widget:
.. code-block:: kv
Root:
MDTabs:
Tab:
title: "Tab 1"
content_text: f"This is an example text for {self.title}"
Tab:
title: "Tab 2"
content_text: f"This is an example text for {self.title}"
...
Example with tab icon
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. tabs::
.. tab:: Declarative KV and imperative python styles
.. code-block:: python
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.tab import MDTabsBase
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.icon_definitions import md_icons
KV = '''
MDBoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Example Tabs"
MDTabs:
id: tabs
on_tab_switch: app.on_tab_switch(*args)
<Tab>
MDIconButton:
id: icon
icon: root.icon
icon_size: "48sp"
pos_hint: {"center_x": .5, "center_y": .5}
'''
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
icons = list(md_icons.keys())[15:30]
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)
def on_start(self):
for tab_name in self.icons:
self.root.ids.tabs.add_widget(Tab(icon=tab_name))
def on_tab_switch(
self, instance_tabs, instance_tab, instance_tab_label, tab_text
):
'''
Called when switching tabs.
:type instance_tabs: <kivymd.uix.tab.MDTabs object>;
:param instance_tab: <__main__.Tab object>;
:param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>;
:param tab_text: text or name icon of tab;
'''
count_icon = instance_tab.icon # get the tab icon
print(f"Welcome to {count_icon}' tab'")
Example().run()
.. tab:: Declarative python styles
.. code-block:: python
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDIconButton
from kivymd.uix.tab import MDTabsBase, MDTabs
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.icon_definitions import md_icons
from kivymd.uix.toolbar import MDTopAppBar
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
icons = list(md_icons.keys())[15:30]
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return (
MDBoxLayout(
MDTopAppBar(title="Example Tabs"),
MDTabs(id="tabs"),
orientation="vertical",
)
)
def on_start(self):
self.root.ids.tabs.bind(on_tab_switch=self.on_tab_switch)
for tab_name in self.icons:
self.root.ids.tabs.add_widget(
Tab(
MDIconButton(
icon=tab_name,
icon_size="48sp",
pos_hint={"center_x": .5, "center_y": .5},
),
icon=tab_name,
)
)
def on_tab_switch(
self, instance_tabs, instance_tab, instance_tab_label, tab_text
):
'''
Called when switching tabs.
:type instance_tabs: <kivymd.uix.tab.MDTabs object>;
:param instance_tab: <__main__.Tab object>;
:param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>;
:param tab_text: text or name icon of tab;
'''
count_icon = instance_tab.icon # get the tab icon
print(f"Welcome to {count_icon}' tab'")
Example().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/tabs-simple-example.gif
:align: center
Example with tab text
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. Note:: The :class:`~MDTabsBase` class has an icon parameter and, by default,
tries to find the name of the icon in the file
``kivymd/icon_definitions.py``.
If the name of the icon is not found, the class will send a message
stating that the icon could not be found.
if the tab has no icon, title or tab_label_text, the class will raise a
ValueError.
.. tabs::
.. tab:: Declarative KV and imperative python styles
.. code-block:: python
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.tab import MDTabsBase
KV = '''
MDBoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Example Tabs"
MDTabs:
id: tabs
on_tab_switch: app.on_tab_switch(*args)
<Tab>
MDLabel:
id: label
text: "Tab 0"
halign: "center"
'''
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)
def on_start(self):
for i in range(20):
self.root.ids.tabs.add_widget(Tab(title=f"Tab {i}"))
def on_tab_switch(
self, instance_tabs, instance_tab, instance_tab_label, tab_text
):
'''Called when switching tabs.
:type instance_tabs: <kivymd.uix.tab.MDTabs object>;
:param instance_tab: <__main__.Tab object>;
:param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>;
:param tab_text: text or name icon of tab;
'''
instance_tab.ids.label.text = tab_text
Example().run()
.. tab:: Declarative python style
.. code-block:: python
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.label import MDLabel
from kivymd.uix.tab import MDTabsBase, MDTabs
from kivymd.uix.toolbar import MDTopAppBar
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return (
MDBoxLayout(
MDTopAppBar(title="Example Tabs"),
MDTabs(id="tabs"),
orientation="vertical",
)
)
def on_start(self):
self.root.ids.tabs.bind(on_tab_switch=self.on_tab_switch)
for i in range(20):
self.root.ids.tabs.add_widget(
Tab(
MDLabel(id="label", text="Tab 0", halign="center"),
title=f"Tab {i}",
)
)
def on_tab_switch(
self, instance_tabs, instance_tab, instance_tab_label, tab_text
):
'''
Called when switching tabs.
:type instance_tabs: <kivymd.uix.tab.MDTabs object>;
:param instance_tab: <__main__.Tab object>;
:param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>;
:param tab_text: text or name icon of tab;
'''
instance_tab.ids.label.text = tab_text
Example().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/tabs-simple-example-text.gif
:align: center
Example with tab icon and text
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. tabs::
.. tab:: Declarative KV and imperative python styles
.. code-block:: python
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.tab import MDTabsBase
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.icon_definitions import md_icons
KV = '''
MDBoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Example Tabs"
MDTabs:
id: tabs
'''
class Tab(MDFloatLayout, MDTabsBase):
pass
class Example(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)
def on_start(self):
for name_tab in list(md_icons.keys())[15:30]:
self.root.ids.tabs.add_widget(Tab(icon=name_tab, title=name_tab))
Example().run()
.. tab:: Declarative python style
.. code-block:: python
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.tab import MDTabsBase, MDTabs
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.icon_definitions import md_icons
from kivymd.uix.toolbar import MDTopAppBar
class Tab(MDFloatLayout, MDTabsBase):
pass
class Example(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return (
MDBoxLayout(
MDTopAppBar(title="Example Tabs"),
MDTabs(id="tabs"),
orientation="vertical",
)
)
def on_start(self):
for name_tab in list(md_icons.keys())[15:30]:
self.root.ids.tabs.add_widget(Tab(icon=name_tab, title=name_tab))
Example().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/tabs-simple-example-icon-text.gif
:align: center
Dynamic tab management
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. tabs::
.. tab:: Declarative KV and imperative python styles
.. code-block:: python
from kivy.lang import Builder
from kivymd.uix.scrollview import MDScrollView
from kivymd.app import MDApp
from kivymd.uix.tab import MDTabsBase
KV = '''
MDBoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Example Tabs"
MDTabs:
id: tabs
<Tab>
MDList:
MDBoxLayout:
adaptive_height: True
MDFlatButton:
text: "ADD TAB"
on_release: app.add_tab()
MDFlatButton:
text: "REMOVE LAST TAB"
on_release: app.remove_tab()
MDFlatButton:
text: "GET TAB LIST"
on_release: app.get_tab_list()
'''
class Tab(MDScrollView, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
index = 0
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)
def on_start(self):
self.add_tab()
def get_tab_list(self):
'''Prints a list of tab objects.'''
print(self.root.ids.tabs.get_tab_list())
def add_tab(self):
self.index += 1
self.root.ids.tabs.add_widget(Tab(title=f"{self.index} tab"))
def remove_tab(self):
if self.index > 1:
self.index -= 1
self.root.ids.tabs.remove_widget(
self.root.ids.tabs.get_tab_list()[-1]
)
Example().run()
.. tab:: Declarative python style
.. code-block:: python
from kivymd.uix.button import MDFlatButton
from kivymd.uix.list import MDList
from kivymd.uix.scrollview import MDScrollView
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.tab import MDTabsBase, MDTabs
from kivymd.uix.toolbar import MDTopAppBar
class Tab(MDScrollView, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
index = 0
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return (
MDBoxLayout(
MDTopAppBar(title="Example Tabs"),
MDTabs(id="tabs"),
orientation="vertical",
)
)
def on_start(self):
self.add_tab()
def get_tab_list(self, *args):
'''Prints a list of tab objects.'''
print(self.root.ids.tabs.get_tab_list())
def add_tab(self, *args):
self.index += 1
self.root.ids.tabs.add_widget(
Tab(
MDList(
MDBoxLayout(
MDFlatButton(
text="ADD TAB",
on_release=self.add_tab,
),
MDFlatButton(
text="REMOVE LAST TAB",
on_release=self.remove_tab,
),
MDFlatButton(
text="GET TAB LIST",
on_release=self.get_tab_list,
),
adaptive_height=True,
),
),
title=f"{self.index} tab",
)
)
def remove_tab(self, *args):
if self.index > 1:
self.index -= 1
self.root.ids.tabs.remove_widget(
self.root.ids.tabs.get_tab_list()[-1]
)
Example().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/tabs-dynamic-managmant.gif
:align: center
Use on_ref_press method
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
You can use markup for the text of the tabs and use the ``on_ref_press``
method accordingly:
.. tabs::
.. tab:: Declarative KV and imperative python styles
.. code-block:: python
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.font_definitions import fonts
from kivymd.uix.tab import MDTabsBase
from kivymd.icon_definitions import md_icons
KV = '''
MDBoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Example Tabs"
MDTabs:
id: tabs
on_ref_press: app.on_ref_press(*args)
<Tab>
MDIconButton:
id: icon
icon: app.icons[0]
icon_size: "48sp"
pos_hint: {"center_x": .5, "center_y": .5}
'''
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
icons = list(md_icons.keys())[15:30]
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)
def on_start(self):
for name_tab in self.icons:
self.root.ids.tabs.add_widget(
Tab(
title=f"[ref={name_tab}][font={fonts[-1]['fn_regular']}]{md_icons['close']}[/font][/ref] {name_tab}"
)
)
def on_ref_press(
self,
instance_tabs,
instance_tab_label,
instance_tab,
instance_tab_bar,
instance_carousel,
):
'''
The method will be called when the ``on_ref_press`` event
occurs when you, for example, use markup text for tabs.
:param instance_tabs: <kivymd.uix.tab.MDTabs object>
:param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>
:param instance_tab: <__main__.Tab object>
:param instance_tab_bar: <kivymd.uix.tab.MDTabsBar object>
:param instance_carousel: <kivymd.uix.tab.MDTabsCarousel object>
'''
# Removes a tab by clicking on the close icon on the left.
for instance_tab in instance_carousel.slides:
if instance_tab.title == instance_tab_label.text:
instance_tabs.remove_widget(instance_tab_label)
break
Example().run()
.. tab:: Declarative python style
.. code-block:: python
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDIconButton
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.font_definitions import fonts
from kivymd.uix.tab import MDTabsBase, MDTabs
from kivymd.icon_definitions import md_icons
from kivymd.uix.toolbar import MDTopAppBar
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
icons = list(md_icons.keys())[15:30]
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return (
MDBoxLayout(
MDTopAppBar(title="Example Tabs"),
MDTabs(id="tabs"),
orientation="vertical",
)
)
def on_start(self):
self.root.ids.tabs.bind(on_ref_press=self.on_ref_press)
for name_tab in self.icons:
self.root.ids.tabs.add_widget(
Tab(
MDIconButton(
icon=self.icons[0],
icon_size="48sp",
pos_hint={"center_x": .5, "center_y": .5}
),
title=(
f"[ref={name_tab}][font={fonts[-1]['fn_regular']}]"
f"{md_icons['close']}[/font][/ref] {name_tab}"
),
)
)
def on_ref_press(
self,
instance_tabs,
instance_tab_label,
instance_tab,
instance_tab_bar,
instance_carousel,
):
'''
The method will be called when the ``on_ref_press`` event
occurs when you, for example, use markup text for tabs.
:param instance_tabs: <kivymd.uix.tab.MDTabs object>
:param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>
:param instance_tab: <__main__.Tab object>
:param instance_tab_bar: <kivymd.uix.tab.MDTabsBar object>
:param instance_carousel: <kivymd.uix.tab.MDTabsCarousel object>
'''
# Removes a tab by clicking on the close icon on the left.
for instance_tab in instance_carousel.slides:
if instance_tab.title == instance_tab_label.text:
instance_tabs.remove_widget(instance_tab_label)
break
Example().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/tabs-on-ref-press.gif
:align: center
Switching the tab by name
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. tabs::
.. tab:: Declarative KV and imperative python styles
.. code-block:: python
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.icon_definitions import md_icons
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.tab import MDTabsBase
KV = '''
MDBoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Example Tabs"
MDTabs:
id: tabs
<Tab>
MDBoxLayout:
orientation: "vertical"
pos_hint: {"center_x": .5, "center_y": .5}
adaptive_size: True
spacing: dp(48)
MDIconButton:
id: icon
icon: "arrow-right"
icon_size: "48sp"
on_release: app.switch_tab_by_name()
MDIconButton:
id: icon2
icon: "page-next"
icon_size: "48sp"
on_release: app.switch_tab_by_object()
'''
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
icons = list(md_icons.keys())[15:30]
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
self.iter_list_names = iter(list(self.icons))
return Builder.load_string(KV)
def on_start(self):
for name_tab in list(self.icons):
self.root.ids.tabs.add_widget(Tab(tab_label_text=name_tab))
self.iter_list_objects = iter(list(self.root.ids.tabs.get_tab_list()))
def switch_tab_by_object(self):
try:
x = next(self.iter_list_objects)
print(f"Switch slide by object, next element to show: [{x}]")
self.root.ids.tabs.switch_tab(x)
except StopIteration:
# reset the iterator an begin again.
self.iter_list_objects = iter(list(self.root.ids.tabs.get_tab_list()))
self.switch_tab_by_object()
def switch_tab_by_name(self):
'''Switching the tab by name.'''
try:
x = next(self.iter_list_names)
print(f"Switch slide by name, next element to show: [{x}]")
self.root.ids.tabs.switch_tab(x)
except StopIteration:
# Reset the iterator an begin again.
self.iter_list_names = iter(list(self.icons))
self.switch_tab_by_name()
Example().run()
.. tab:: Declarative python style
.. code-block:: python
from kivy.metrics import dp
from kivymd.app import MDApp
from kivymd.icon_definitions import md_icons
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDIconButton
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.tab import MDTabsBase, MDTabs
from kivymd.uix.toolbar import MDTopAppBar
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class Example(MDApp):
icons = list(md_icons.keys())[15:30]
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
self.iter_list_names = iter(list(self.icons))
return (
MDBoxLayout(
MDTopAppBar(title="Example Tabs"),
MDTabs(id="tabs"),
orientation="vertical",
)
)
def on_start(self):
for name_tab in list(self.icons):
self.root.ids.tabs.add_widget(
Tab(
MDBoxLayout(
MDIconButton(
id="icon",
icon="arrow-right",
icon_size="48sp",
on_release=self.switch_tab_by_name,
),
MDIconButton(
id="icon2",
icon="arrow-left",
icon_size="48sp",
on_release=self.switch_tab_by_object,
),
orientation="vertical",
pos_hint={"center_x": .5, "center_y": .5},
adaptive_size=True,
spacing=dp(48),
),
tab_label_text=name_tab,
)
)
self.iter_list_objects = iter(list(self.root.ids.tabs.get_tab_list()))
def switch_tab_by_object(self, *args):
try:
x = next(self.iter_list_objects)
print(f"Switch slide by object, next element to show: [{x}]")
self.root.ids.tabs.switch_tab(x)
except StopIteration:
# reset the iterator an begin again.
self.iter_list_objects = iter(
list(self.root.ids.tabs.get_tab_list()))
self.switch_tab_by_object()
def switch_tab_by_name(self, *args):
'''Switching the tab by name.'''
try:
x = next(self.iter_list_names)
print(f"Switch slide by name, next element to show: [{x}]")
self.root.ids.tabs.switch_tab(x)
except StopIteration:
# Reset the iterator an begin again.
self.iter_list_names = iter(list(self.icons))
self.switch_tab_by_name()
Example().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/switching-tab-by-name.gif
:align: center
"""
Te6edf3__all__ Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffMDTabsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMDTabsBaseTa5d6ff"Tb4b4b4)
Tff7b72import T7ee787os
Tff7b72from T7ee787typing Tff7b72import Te6edf3Union
Tff7b72from T7ee787kivyT7ee787.T7ee787clock Tff7b72import Te6edf3Clock
Tff7b72from T7ee787kivyT7ee787.T7ee787graphicsT7ee787.T7ee787texture Tff7b72import Te6edf3Texture
Tff7b72from T7ee787kivyT7ee787.T7ee787lang Tff7b72import Te6edf3Builder
Tff7b72from T7ee787kivyT7ee787.T7ee787logger Tff7b72import Te6edf3Logger
Tff7b72from T7ee787kivyT7ee787.T7ee787metrics Tff7b72import Te6edf3dp
Tff7b72from T7ee787kivyT7ee787.T7ee787properties Tff7b72import Tb4b4b4(
Te6edf3AliasPropertyTb4b4b4,
Te6edf3BooleanPropertyTb4b4b4,
Te6edf3BoundedNumericPropertyTb4b4b4,
Te6edf3ColorPropertyTb4b4b4,
Te6edf3ListPropertyTb4b4b4,
Te6edf3NumericPropertyTb4b4b4,
Te6edf3ObjectPropertyTb4b4b4,
Te6edf3OptionPropertyTb4b4b4,
Te6edf3StringPropertyTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787anchorlayout Tff7b72import Te6edf3AnchorLayout
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787behaviors Tff7b72import Te6edf3ToggleButtonBehavior
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787scrollview Tff7b72import Te6edf3ScrollView
Tff7b72from T7ee787kivyT7ee787.T7ee787utils Tff7b72import Te6edf3boundary
Tff7b72from T7ee787kivymd Tff7b72import Te6edf3uix_path
Tff7b72from T7ee787kivymdT7ee787.T7ee787font_definitions Tff7b72import Te6edf3fontsTb4b4b4, Te6edf3theme_font_styles
Tff7b72from T7ee787kivymdT7ee787.T7ee787icon_definitions Tff7b72import Te6edf3md_icons
Tff7b72from T7ee787kivymdT7ee787.T7ee787theming Tff7b72import Te6edf3ThemableBehaviorTb4b4b4, Te6edf3ThemeManager
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787behaviors Tff7b72import Tb4b4b4(
Te6edf3DeclarativeBehaviorTb4b4b4,
Te6edf3RectangularRippleBehaviorTb4b4b4,
Te6edf3SpecificBackgroundColorBehaviorTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787boxlayout Tff7b72import Te6edf3MDBoxLayout
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787card Tff7b72import Te6edf3MDCard
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787carousel Tff7b72import Te6edf3MDCarousel
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787label Tff7b72import Te6edf3MDLabel
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3uix_pathTb4b4b4, Ta5d6ff"Ta5d6fftabTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftab.kvTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3kv_fileTb4b4b4:
Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3kv_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72class T56d364MDTabsExceptionTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72class T56d364MDTabsLabelTb4b4b4(Te6edf3ToggleButtonBehaviorTb4b4b4, Te6edf3RectangularRippleBehaviorTb4b4b4, Te6edf3MDLabelTb4b4b4)Tb4b4b4:
T8b949e"""This class it represent the label of each tab."""
Te6edf3text_color_normal Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3text_color_active Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3tab Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tb4b4b4)
Te6edf3tab_bar Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tb4b4b4)
Te6edf3font_name Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff"Ta5d6ffRobotoTa5d6ff"Tb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsplit_str Tff7b72= Ta5d6ff"Ta5d6ff ,-Ta5d6ff"
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmax_lines Tff7b72= T79c0ff2
Tff7b72selfTff7b72.Td2a8ffsize_hint_x Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsize_hint_min_x Tff7b72= Te6edf3dpTb4b4b4(T79c0ff90Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmin_space Tff7b72= Te6edf3dpTb4b4b4(T79c0ff98Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbindTb4b4b4(
Te6edf3textTff7b72=Tff7b72selfTff7b72.Td2a8ff_update_text_sizeTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ffon_releaseTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffparentTff7b72.Td2a8ffdispatchTb4b4b4(
Ta5d6ff"Ta5d6ffon_tab_switchTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8fftabTb4b4b4, Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8fftext
Tb4b4b4)
T8b949e# If the label is selected load the relative tab from carousel.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Ta5d6ff"Ta5d6ffdownTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffparentTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffload_slideTb4b4b4(Tff7b72selfTff7b72.Td2a8fftabTb4b4b4)
Tff7b72except Tf85149KeyErrorTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffon_textureTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3instance_tabs_labelTb4b4b4, Te6edf3textureTb4b4b4: Te6edf3TextureTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e# Just save the minimum width of the label based of the content.
Tff7b72if Te6edf3textureTb4b4b4:
Te6edf3max_width Tff7b72= Te6edf3dpTb4b4b4(T79c0ff360Tb4b4b4)
Te6edf3min_width Tff7b72= Te6edf3dpTb4b4b4(T79c0ff90Tb4b4b4)
Tff7b72if Te6edf3textureTff7b72.Td2a8ffwidth Tff7b72> Te6edf3max_widthTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72= Te6edf3max_width
Tff7b72selfTff7b72.Td2a8fftext_size Tff7b72= Tb4b4b4(Te6edf3max_widthTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72elif Te6edf3textureTff7b72.Td2a8ffwidth Tff7b72< Te6edf3min_widthTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72= Te6edf3min_width
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72= Te6edf3textureTff7b72.Td2a8ffwidth
Tff7b72def Td2a8ff_update_text_sizeTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftab_barTb4b4b4:
Tff7b72return
Tff7b72if Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffparentTff7b72.Td2a8ffallow_stretch Tff7b72is Tff7b72TrueTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftext_size Tff7b72= Tb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72= Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffparentTff7b72.Td2a8fffixed_tab_label_width
Tff7b72selfTff7b72.Td2a8fftext_size Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwidthTb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ff_label_request_indicator_updateTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72class T56d364MDTabsBaseTb4b4b4:
T8b949e"""
This class allow you to create a tab.
You must create a new class that inherits from MDTabsBase.
In this way you have total control over the views of your tabbed panel.
"""
Te6edf3icon Tff7b72= Te6edf3StringPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
This property will set the Tab's Label Icon.
:attr:`icon` is an :class:`~kivy.properties.StringProperty`
and defaults to `''`.
"""
Te6edf3title_icon_mode Tff7b72= Te6edf3OptionPropertyTb4b4b4(Ta5d6ff"Ta5d6ffLeadTa5d6ff"Tb4b4b4, Te6edf3optionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffLeadTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTopTa5d6ff"Tb4b4b4]Tb4b4b4)
T8b949e"""
This property sets the mode in wich the tab's title and icon are shown.
:attr:`title_icon_mode` is an :class:`~kivy.properties.OptionProperty`
and defaults to `'Lead'`.
"""
Te6edf3title Tff7b72= Te6edf3StringPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
This property will set the Name of the tab.
.. note::
As a side note.
All tabs have set `markup = True`.
Thanks to this, you can use the kivy markup language to set a colorful
and fully customizable tabs titles.
.. warning::
The material design requires that every title label is written in
capital letters, because of this, the `string.upper()` will be applied
to it's contents.
:attr:`title` is an :class:`~kivy.properties.StringProperty`
and defaults to `''`.
"""
Te6edf3title_is_capital Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72FalseTb4b4b4)
T8b949e"""
This value controls wether if the title property should be converted to
capital letters.
:attr:`title_is_capital` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `True`.
"""
Te6edf3tab_label_text Tff7b72= Te6edf3StringPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
This property is the actual title's Label of the tab.
use the property :attr:`icon` and :attr:`title` to set this property
correctly.
This property is kept public for specific and backward compatibility
purposes.
:attr:`tab_label_text` is an :class:`~kivy.properties.StringProperty`
and defaults to `''`.
"""
Te6edf3tab_label Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
It is the label object reference of the tab.
:attr:`tab_label` is an :class:`~kivy.properties.ObjectProperty`
and defaults to `None`.
"""
Tff7b72def Td2a8ff_get_label_font_styleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftab_labelTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fftab_labelTff7b72.Td2a8fffont_style
Tff7b72def Td2a8ff_set_label_font_styleTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftab_labelTb4b4b4:
Tff7b72if Te6edf3value Tff7b72in Te6edf3theme_font_stylesTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_labelTff7b72.Td2a8fffont_style Tff7b72= Te6edf3value
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6fftab_label_font_style:Tffea00\nTffea00\tTa5d6ff"
Ta5d6ff"Ta5d6fffont_style not found in theme_font_stylesTffea00\nTffea00\tTa5d6ff"
Ta5d6fffTa5d6ff"Ta5d6fffont_style = Tffd700{Te6edf3valueTffd700}Ta5d6ff"
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72lambda Te6edf3xTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_set_label_font_styleTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72True
Te6edf3tab_label_font_style Tff7b72= Te6edf3AliasPropertyTb4b4b4(
Te6edf3_get_label_font_styleTb4b4b4,
Te6edf3_set_label_font_styleTb4b4b4,
Te6edf3cacheTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
T8b949e"""
:attr:`tab_label_font_style` is an :class:`~kivy.properties.AliasProperty`
that behavies similar to an :class:`~kivy.properties.OptionProperty`.
This property's behavior allows the developer to use any new label style
registered to the app.
This property will affect the Tab's Title Label widget.
"""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_label Tff7b72= Te6edf3MDTabsLabelTb4b4b4(Te6edf3tabTff7b72=Tff7b72selfTb4b4b4)
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbindTb4b4b4(
Te6edf3iconTff7b72=Tff7b72selfTff7b72.Td2a8ff_update_textTb4b4b4,
Te6edf3titleTff7b72=Tff7b72selfTff7b72.Td2a8ff_update_textTb4b4b4,
Te6edf3title_icon_modeTff7b72=Tff7b72selfTff7b72.Td2a8ff_update_textTb4b4b4,
Te6edf3tab_label_textTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_label_textTb4b4b4,
Te6edf3title_is_capitalTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_label_textTb4b4b4,
Tb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_update_text
Tb4b4b4) T8b949e# this will ensure the text is correct
Tff7b72def Td2a8ff_update_textTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
T8b949e# Ensures that the title is in capital letters.
Tff7b72if Tff7b72selfTff7b72.Td2a8fftitle Tff7b72and Tff7b72selfTff7b72.Td2a8fftitle_is_capital Tff7b72is Tff7b72TrueTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftitle Tff7b72!= Tff7b72selfTff7b72.Td2a8fftitleTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftitle Tff7b72= Tff7b72selfTff7b72.Td2a8fftitleTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4)
T8b949e# Avoids event recursion.
Tff7b72return
T8b949e# Add the icon.
Tff7b72if Tff7b72selfTff7b72.Td2a8fficon Tff7b72and Tff7b72selfTff7b72.Td2a8fficon Tff7b72in Te6edf3md_iconsTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_label_text Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[size=24sp][font=Tffd700{Te6edf3fontsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff'Ta5d6fffn_regularTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff]Tffd700{Te6edf3md_iconsTb4b4b4[Tff7b72selfTff7b72.Td2a8fficonTb4b4b4]Tffd700}Ta5d6ff[/size][/font]Ta5d6ff"
Tff7b72if Tff7b72selfTff7b72.Td2a8fftitleTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_label_text Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftab_label_text
Tff7b72+ Tb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72if Tff7b72selfTff7b72.Td2a8fftitle_icon_mode Tff7b72== Ta5d6ff"Ta5d6ffLeadTa5d6ff" Tff7b72else Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72+ Tff7b72selfTff7b72.Td2a8fftitle
Tb4b4b4)
T8b949e# Add the title.
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fficonTb4b4b4:
Te6edf3LoggerTff7b72.Td2a8fferrorTb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff: [UID] = [Tffd700{Tff7b72selfTff7b72.Td2a8ffuidTffd700}Ta5d6ff]:Tffea00\nTffea00\tTa5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffIcon Ta5d6ff'Tffd700{Tff7b72selfTff7b72.Td2a8fficonTffd700}Ta5d6ff'Ta5d6ff not found in md_iconsTa5d6ff"
Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftitleTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_label_text Tff7b72= Tff7b72selfTff7b72.Td2a8fftitle
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftab_label_textTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff: [UID] = [Tffd700{Tff7b72selfTff7b72.Td2a8ffuidTffd700}Ta5d6ff]:Tffea00\nTffea00\tTa5d6ff"
Ta5d6ff"Ta5d6ffNo valid Icon was found.Tffea00\nTffea00\tTa5d6ff"
Ta5d6ff"Ta5d6ffNo valid Title was found.Tffea00\nTffea00\tTa5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffIconTffea00\tTa5d6ff= Ta5d6ff'Tffd700{Tff7b72selfTff7b72.Td2a8fficonTffd700}Ta5d6ff'Tffea00\nTffea00\tTa5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffTitleTffea00\tTa5d6ff= Ta5d6ff'Tffd700{Tff7b72selfTff7b72.Td2a8fftitleTffd700}Ta5d6ff'Tffea00\nTffea00\tTa5d6ff"
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftab_labelTff7b72.Td2a8ffpadding Tff7b72= Te6edf3dpTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4, T79c0ff0
Tff7b72selfTff7b72.Td2a8ffupdate_label_textTb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72selfTff7b72.Td2a8fftab_label_textTb4b4b4)
Tff7b72def Td2a8ffupdate_label_textTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3instance_user_tabTb4b4b4, Te6edf3text_tabTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_labelTff7b72.Td2a8fftext Tff7b72= Te6edf3text_tab
Tff7b72class T56d364MDTabsMainTb4b4b4(Te6edf3MDBoxLayoutTb4b4b4)Tb4b4b4:
T8b949e"""
This class is just a boxlayout that contain the carousel.
It allows you to have control over the carousel.
"""
Tff7b72class T56d364MDTabsCarouselTb4b4b4(Te6edf3MDCarouselTb4b4b4)Tb4b4b4:
Te6edf3lock_swiping Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72FalseTb4b4b4)
T8b949e"""
If True - disable switching tabs by swipe.
:attr:`lock_swiping` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `False`.
"""
Tff7b72def Td2a8ffon_touch_moveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3touchTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflock_swipingTb4b4b4: T8b949e# lock a swiping
Tff7b72return
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftouch_mode_changeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffignore_perpendicular_swipes Tff7b72and Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72in Tb4b4b4(
Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbottomTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3touchTff7b72.Td2a8ffoy Tff7b72- Te6edf3touchTff7b72.Td2a8ffyTb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffscroll_distanceTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3touchTff7b72.Td2a8ffox Tff7b72- Te6edf3touchTff7b72.Td2a8ffxTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffscroll_distanceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_change_touch_modeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftouch_mode_change Tff7b72= Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffignore_perpendicular_swipes Tff7b72and Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72in Tb4b4b4(
Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3touchTff7b72.Td2a8ffox Tff7b72- Te6edf3touchTff7b72.Td2a8ffxTb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffscroll_distanceTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3touchTff7b72.Td2a8ffoy Tff7b72- Te6edf3touchTff7b72.Td2a8ffyTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffscroll_distanceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_change_touch_modeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftouch_mode_change Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_get_uidTb4b4b4(Ta5d6ff"Ta5d6ffcavoidTa5d6ff"Tb4b4b4) Tff7b72in Te6edf3touchTff7b72.Td2a8ffudTb4b4b4:
Tff7b72return
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_touch Tff7b72is Tff7b72not Te6edf3touchTb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffon_touch_moveTb4b4b4(Te6edf3touchTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_get_uidTb4b4b4(Tb4b4b4) Tff7b72in Te6edf3touchTff7b72.Td2a8ffud
Tff7b72if Te6edf3touchTff7b72.Td2a8ffgrab_current Tff7b72is Tff7b72not Tff7b72selfTb4b4b4:
Tff7b72return Tff7b72True
Te6edf3ud Tff7b72= Te6edf3touchTff7b72.Td2a8ffudTb4b4b4[Tff7b72selfTff7b72.Td2a8ff_get_uidTb4b4b4(Tb4b4b4)Tb4b4b4]
Te6edf3direction Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectionTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3udTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4:
Tff7b72if Te6edf3direction Tff7b72in Ta5d6ff"Ta5d6ffrlTa5d6ff"Tb4b4b4:
Te6edf3distance Tff7b72= Tffa657absTb4b4b4(Te6edf3touchTff7b72.Td2a8ffox Tff7b72- Te6edf3touchTff7b72.Td2a8ffxTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3distance Tff7b72= Tffa657absTb4b4b4(Te6edf3touchTff7b72.Td2a8ffoy Tff7b72- Te6edf3touchTff7b72.Td2a8ffyTb4b4b4)
Tff7b72if Te6edf3distance Tff7b72> Tff7b72selfTff7b72.Td2a8ffscroll_distanceTb4b4b4:
Te6edf3ev Tff7b72= Tff7b72selfTff7b72.Td2a8ff_change_touch_mode_ev
Tff7b72if Te6edf3ev Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3evTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3udTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffscrollTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3direction Tff7b72in Ta5d6ff"Ta5d6ffrlTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_offset Tff7b72+Tff7b72= Te6edf3touchTff7b72.Td2a8ffdx
Tff7b72if Te6edf3direction Tff7b72in Ta5d6ff"Ta5d6fftbTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_offset Tff7b72+Tff7b72= Te6edf3touchTff7b72.Td2a8ffdy
Tff7b72return Tff7b72True
Tff7b72class T56d364MDTabsScrollViewTb4b4b4(Te6edf3ScrollViewTb4b4b4)Tb4b4b4:
T8b949e"""This class hacked version to fix scroll_x manual setting."""
Tff7b72def Td2a8ffgotoTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3scroll_xTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657floatTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4, Te6edf3scroll_yTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657floatTb4b4b4, Tff7b72NoneTb4b4b4]
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Update event value along with scroll_*."""
Tff7b72def Td2a8ff_updateTb4b4b4(Te6edf3eTb4b4b4, Te6edf3xTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3eTb4b4b4:
Te6edf3eTff7b72.Td2a8ffvalue Tff7b72= Tb4b4b4(Te6edf3eTff7b72.Td2a8ffmax Tff7b72+ Te6edf3eTff7b72.Td2a8ffminTb4b4b4) Tff7b72* Te6edf3x
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3scroll_x Tff7b72is Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffscroll_x Tff7b72= Te6edf3scroll_x
Te6edf3_updateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffeffect_xTb4b4b4, Te6edf3scroll_xTb4b4b4)
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3scroll_y Tff7b72is Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffscroll_y Tff7b72= Te6edf3scroll_y
Te6edf3_updateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffeffect_yTb4b4b4, Te6edf3scroll_yTb4b4b4)
Tff7b72class T56d364MDTabsBarTb4b4b4(Te6edf3MDCardTb4b4b4)Tb4b4b4:
T8b949e"""
This class is just a boxlayout that contains the scroll view for tabs.
It is also responsible for resizing the tab shortcut when necessary.
"""
Te6edf3target Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3allownoneTff7b72=Tff7b72TrueTb4b4b4)
T8b949e"""
It is the carousel reference of the next tab / slide.
When you go from `'Tab A'` to `'Tab B'`, `'Tab B'` will be the
target tab / slide of the carousel.
:attr:`target` is an :class:`~kivy.properties.ObjectProperty`
and default to `None`.
"""
Tff7b72def Td2a8ffget_rect_instructionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3canvas_instructions Tff7b72= Tff7b72selfTff7b72.Td2a8fflayoutTff7b72.Td2a8ffcanvasTff7b72.Td2a8ffbeforeTff7b72.Td2a8ffget_groupTb4b4b4(
Ta5d6ff"Ta5d6ffIndicator_lineTa5d6ff"
Tb4b4b4)
Tff7b72return Te6edf3canvas_instructionsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3indicator Tff7b72= Te6edf3AliasPropertyTb4b4b4(Te6edf3get_rect_instructionTb4b4b4, Te6edf3cacheTff7b72=Tff7b72TrueTb4b4b4)
T8b949e"""
It is the :class:`~kivy.graphics.vertex_instructions.RoundedRectangle`
instruction reference of the tab indicator.
:attr:`indicator` is an :class:`~kivy.properties.AliasProperty`.
"""
Tff7b72def Td2a8ffget_last_scroll_xTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffscrollviewTff7b72.Td2a8ffscroll_x
Te6edf3last_scroll_x Tff7b72= Te6edf3AliasPropertyTb4b4b4(
Te6edf3get_last_scroll_xTb4b4b4, Te6edf3bindTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6fftargetTa5d6ff"Tb4b4b4,Tb4b4b4)Tb4b4b4, Te6edf3cacheTff7b72=Tff7b72True
Tb4b4b4)
T8b949e"""
Is the carousel reference of the next tab/slide.
When you go from `'Tab A'` to `'Tab B'`, `'Tab B'` will be the
target tab/slide of the carousel.
:attr:`last_scroll_x` is an :class:`~kivy.properties.AliasProperty`.
"""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72def Td2a8ffupdate_indicatorTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3xTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657floatTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4, Te6edf3wTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657floatTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4, Te6edf3radiusTff7b72=Tff7b72None
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e# Update position and size of the indicator.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftab_indicator_type Tff7b72== Ta5d6ff"Ta5d6ffline-roundTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ff_line_x Tff7b72= Te6edf3x
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ff_line_width Tff7b72= Te6edf3w
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ff_line_height Tff7b72= Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftab_indicator_height
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ff_line_radius Tff7b72= Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftab_indicator_height Tff7b72/ T79c0ff2
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftab_indicator_type Tff7b72== Ta5d6ff"Ta5d6ffline-rectTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ff_line_x Tff7b72= Te6edf3x
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ff_line_width Tff7b72= Te6edf3w
Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8ff_line_height Tff7b72= Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftab_indicator_height
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffindicatorTff7b72.Td2a8ffpos Tff7b72= Tb4b4b4(Te6edf3xTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffindicatorTff7b72.Td2a8ffsize Tff7b72= Tb4b4b4(Te6edf3wTb4b4b4, Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftab_indicator_heightTb4b4b4)
Tff7b72if Te6edf3radiusTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffindicatorTff7b72.Td2a8ffradius Tff7b72= Te6edf3radius
Tff7b72def Td2a8fftab_bar_autoscrollTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3instance_tab_labelTb4b4b4: Te6edf3MDTabsLabelTb4b4b4, Te6edf3stepTb4b4b4: Tffa657floatTb4b4b4)Tb4b4b4:
T8b949e# Automatic scroll animation of the tab bar.
Te6edf3bound_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffcenter_x Tff7b72- Tff7b72selfTff7b72.Td2a8ffx
Te6edf3bound_right Tff7b72= Tff7b72selfTff7b72.Td2a8fflayoutTff7b72.Td2a8ffwidth Tff7b72- Te6edf3bound_left
Te6edf3dt Tff7b72= Te6edf3instance_tab_labelTff7b72.Td2a8ffcenter_x Tff7b72- Te6edf3bound_left
Te6edf3sxTb4b4b4, Te6edf3sy Tff7b72= Tff7b72selfTff7b72.Td2a8ffscrollviewTff7b72.Td2a8ffconvert_distance_to_scrollTb4b4b4(Te6edf3dtTb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3lsx Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_scroll_x T8b949e# ast scroll x of the tab bar
Te6edf3scroll_is_late Tff7b72= Te6edf3lsx Tff7b72< Te6edf3sx T8b949e# determine scroll direction
Te6edf3dst Tff7b72= Tffa657absTb4b4b4(Te6edf3lsx Tff7b72- Te6edf3sxTb4b4b4) Tff7b72* Te6edf3step T8b949e# distance to run
Tff7b72if Tff7b72not Te6edf3dstTb4b4b4:
Tff7b72return
Tff7b72if Te6edf3scroll_is_late Tff7b72and Te6edf3instance_tab_labelTff7b72.Td2a8ffcenter_x Tff7b72> Te6edf3bound_leftTb4b4b4:
Te6edf3x Tff7b72= Te6edf3lsx Tff7b72+ Te6edf3dst
Tff7b72elif Tff7b72not Te6edf3scroll_is_late Tff7b72and Te6edf3instance_tab_labelTff7b72.Td2a8ffcenter_x Tff7b72< Te6edf3bound_rightTb4b4b4:
Te6edf3x Tff7b72= Te6edf3lsx Tff7b72- Te6edf3dst
Tff7b72elseTb4b4b4:
Tff7b72return
Te6edf3x Tff7b72= Te6edf3boundaryTb4b4b4(Te6edf3xTb4b4b4, T79c0ff0.0Tb4b4b4, T79c0ff1.0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffscrollviewTff7b72.Td2a8ffgotoTb4b4b4(Te6edf3xTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8ffandroid_animationTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3instance_carouselTb4b4b4: Te6edf3MDTabsCarouselTb4b4b4, Te6edf3offsetTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657floatTb4b4b4, Tffa657intTb4b4b4]
Tb4b4b4)Tb4b4b4:
T8b949e# Try to reproduce the android animation effect.
Tff7b72if Te6edf3offset Tff7b72!= T79c0ff0 Tff7b72and Tffa657absTb4b4b4(Te6edf3offsetTb4b4b4) Tff7b72< Te6edf3instance_carouselTff7b72.Td2a8ffwidthTb4b4b4:
Te6edf3forward Tff7b72= Te6edf3offset Tff7b72< T79c0ff0
Te6edf3offset Tff7b72= Tffa657absTb4b4b4(Te6edf3offsetTb4b4b4)
Te6edf3step Tff7b72= Te6edf3offset Tff7b72/ Tffa657floatTb4b4b4(Te6edf3instance_carouselTff7b72.Td2a8ffwidthTb4b4b4)
Te6edf3indicator_animation Tff7b72= Tff7b72selfTff7b72.Td2a8ffparentTff7b72.Td2a8fftab_indicator_anim
Te6edf3skip_slide Tff7b72= Tb4b4b4(
Te6edf3instance_carouselTff7b72.Td2a8ffslidesTb4b4b4[Te6edf3instance_carouselTff7b72.Td2a8ff_skip_slideTb4b4b4]
Tff7b72if Te6edf3instance_carouselTff7b72.Td2a8ff_skip_slide Tff7b72is Tff7b72not Tff7b72None
Tff7b72else Tff7b72None
Tb4b4b4)
Te6edf3next_slide Tff7b72= Tb4b4b4(
Te6edf3instance_carouselTff7b72.Td2a8ffnext_slide
Tff7b72if Te6edf3forward
Tff7b72else Te6edf3instance_carouselTff7b72.Td2a8ffprevious_slide
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftarget Tff7b72= Te6edf3skip_slide Tff7b72if Te6edf3skip_slide Tff7b72else Te6edf3next_slide
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftargetTb4b4b4:
Tff7b72return
Te6edf3a Tff7b72= Te6edf3instance_carouselTff7b72.Td2a8ffcurrent_slideTff7b72.Td2a8fftab_label
Te6edf3b Tff7b72= Tff7b72selfTff7b72.Td2a8fftargetTff7b72.Td2a8fftab_label
Tff7b72selfTff7b72.Td2a8fftab_bar_autoscrollTb4b4b4(Te6edf3bTb4b4b4, Te6edf3stepTb4b4b4)
T8b949e# Avoids the animation if `indicator_animation` is True.
Tff7b72if Te6edf3indicator_animation Tff7b72is Tff7b72FalseTb4b4b4:
Tff7b72return
Te6edf3gap_x Tff7b72= Tffa657absTb4b4b4(Tb4b4b4(Te6edf3aTff7b72.Td2a8ffxTb4b4b4) Tff7b72- Tb4b4b4(Te6edf3bTff7b72.Td2a8ffxTb4b4b4)Tb4b4b4)
Te6edf3gap_w Tff7b72= Tb4b4b4(Te6edf3bTff7b72.Td2a8ffwidthTb4b4b4) Tff7b72- Tb4b4b4(Te6edf3aTff7b72.Td2a8ffwidthTb4b4b4)
Tff7b72if Te6edf3forwardTb4b4b4:
Te6edf3x_step Tff7b72= Te6edf3aTff7b72.Td2a8ffx Tff7b72+ Tb4b4b4(Te6edf3gap_x Tff7b72* Te6edf3stepTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3x_step Tff7b72= Te6edf3aTff7b72.Td2a8ffx Tff7b72- Te6edf3gap_x Tff7b72* Te6edf3step
Te6edf3w_step Tff7b72= Te6edf3aTff7b72.Td2a8ffwidth Tff7b72+ Tb4b4b4(Te6edf3gap_w Tff7b72* Te6edf3stepTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_indicatorTb4b4b4(Te6edf3x_stepTb4b4b4, Te6edf3w_stepTb4b4b4)
Tff7b72def Td2a8ff_label_request_indicator_updateTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Te6edf3widget Tff7b72= Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffcurrent_slideTff7b72.Td2a8fftab_label
Tff7b72selfTff7b72.Td2a8ffupdate_indicatorTb4b4b4(Te6edf3widgetTff7b72.Td2a8ffxTb4b4b4, Te6edf3widgetTff7b72.Td2a8ffwidthTb4b4b4)
Tff7b72class T56d364MDTabsTb4b4b4(
Te6edf3DeclarativeBehaviorTb4b4b4,
Te6edf3ThemableBehaviorTb4b4b4,
Te6edf3SpecificBackgroundColorBehaviorTb4b4b4,
Te6edf3AnchorLayoutTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""
Tabs class.
You can use this class to create your own tabbed panel.
For more information, see in the
:class:`~kivymd.uix.behaviors.DeclarativeBehavior` and
:class:`~kivymd.theming.ThemableBehavior` and
:class:`~kivymd.uix.behaviors.SpecificBackgroundColorBehavior` and
:class:`~kivy.uix.anchorlayout.AnchorLayout`
classes documentation.
:Events:
`on_tab_switch`
Called when switching tabs.
`on_slide_progress`
Called while the slide is scrolling.
`on_ref_press`
The method will be called when the ``on_ref_press`` event
occurs when you, for example, use markup text for tabs.
"""
Te6edf3tab_bar_height Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff48dpTa5d6ff"Tb4b4b4)
T8b949e"""
Height of the tab bar.
:attr:`tab_bar_height` is an :class:`~kivy.properties.NumericProperty`
and defaults to `'48dp'`.
"""
Te6edf3tab_padding Tff7b72= Te6edf3ListPropertyTb4b4b4(Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4]Tb4b4b4)
T8b949e"""
Padding of the tab bar.
:attr:`tab_padding` is an :class:`~kivy.properties.ListProperty`
and defaults to `[0, 0, 0, 0]`.
"""
Te6edf3tab_indicator_anim Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72FalseTb4b4b4)
T8b949e"""
Tab indicator animation. If you want use animation set it to ``True``.
:attr:`tab_indicator_anim` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `False`.
"""
Te6edf3tab_indicator_height Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff2dpTa5d6ff"Tb4b4b4)
T8b949e"""
Height of the tab indicator.
:attr:`tab_indicator_height` is an :class:`~kivy.properties.NumericProperty`
and defaults to `'2dp'`.
"""
Te6edf3tab_indicator_type Tff7b72= Te6edf3OptionPropertyTb4b4b4(
Ta5d6ff"Ta5d6fflineTa5d6ff"Tb4b4b4, Te6edf3optionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6fflineTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffillTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffroundTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffline-roundTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffline-rectTa5d6ff"Tb4b4b4]
Tb4b4b4)
T8b949e"""
Type of tab indicator. Available options are: `'line'`, `'fill'`,
`'round'`, `'line-rect'` and `'line-round'`.
:attr:`tab_indicator_type` is an :class:`~kivy.properties.OptionProperty`
and defaults to `'line'`.
"""
Te6edf3tab_hint_x Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72FalseTb4b4b4)
T8b949e"""
This option affects the size of each child. if it's `True`, the size of
each tab will be ignored and will use the size available by the container.
:attr:`tab_hint_x` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `False`.
"""
Te6edf3anim_duration Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0.2Tb4b4b4)
T8b949e"""
Duration of the slide animation.
:attr:`anim_duration` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0.2`.
"""
Te6edf3anim_threshold Tff7b72= Te6edf3BoundedNumericPropertyTb4b4b4(
T79c0ff0.8Tb4b4b4, Tffa657minTff7b72=T79c0ff0.0Tb4b4b4, Tffa657maxTff7b72=T79c0ff1.0Tb4b4b4, Te6edf3errorhandlerTff7b72=Tff7b72lambda Te6edf3xTb4b4b4: T79c0ff0.0 Tff7b72if Te6edf3x Tff7b72< T79c0ff0.0 Tff7b72else T79c0ff1.0
Tb4b4b4)
T8b949e"""
Animation threshold allow you to change the tab indicator animation effect.
:attr:`anim_threshold` is an :class:`~kivy.properties.BoundedNumericProperty`
and defaults to `0.8`.
"""
Te6edf3allow_stretch Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72TrueTb4b4b4)
T8b949e"""
If `True`, the tab will update dynamically (if :attr:`tab_hint_x` is `True`)
to it's content width, and wrap any text if the widget is wider than `"360dp"`.
If `False`, the tab won't update to it's maximum texture width.
this means that the `fixed_tab_label_width` will be used as the label
width. this will wrap any text inside to fit the fixed value.
:attr:`allow_stretch` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `True`.
"""
Te6edf3fixed_tab_label_width Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff140dpTa5d6ff"Tb4b4b4)
T8b949e"""
If :attr:`allow_stretch` is `False`, the class will set this value as the
width to all the tabs title label.
:attr:`fixed_tab_label_width` is an :class:`~kivy.properties.NumericProperty`
and defaults to `140dp`.
"""
Te6edf3background_color Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
T8b949e"""
Background color of tabs in (r, g, b, a) or string format.
:attr:`background_color` is an :class:`~kivy.properties.ColorProperty`
and defaults to `None`.
"""
Te6edf3underline_color Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4]Tb4b4b4)
T8b949e"""
Underline color of tabs in (r, g, b, a) or string format.
:attr:`underline_color` is an :class:`~kivy.properties.ColorProperty`
and defaults to `[0, 0, 0, 0]`.
"""
Te6edf3text_color_normal Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
T8b949e"""
Text color in (r, g, b, a) or string format of the label when it is not selected.
:attr:`text_color_normal` is an :class:`~kivy.properties.ColorProperty`
and defaults to `None`.
"""
Te6edf3text_color_active Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
T8b949e"""
Text color in (r, g, b, a) or string format of the label when it is selected.
:attr:`text_color_active` is an :class:`~kivy.properties.ColorProperty`
and defaults to `None`.
"""
Te6edf3shadow_softness Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff12Tb4b4b4)
T8b949e"""
See :attr:`kivymd.uix.behaviors.CommonElevationBehavior.shadow_softness`
attribute.
.. versionadded:: 1.1.0
:attr:`shadow_softness` is an :class:`~kivy.properties.NumericProperty`
and defaults to `12`.
"""
Te6edf3shadow_color Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0.6Tb4b4b4]Tb4b4b4)
T8b949e"""
See :attr:`kivymd.uix.behaviors.CommonElevationBehavior.shadow_color`
attribute.
.. versionadded:: 1.1.0
:attr:`shadow_color` is an :class:`~kivy.properties.ColorProperty`
and defaults to `[0, 0, 0, 0.6]`.
"""
Te6edf3shadow_offset Tff7b72= Te6edf3ListPropertyTb4b4b4(Tb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
T8b949e"""
See :attr:`kivymd.uix.behaviors.CommonElevationBehavior.shadow_offset`
attribute.
.. versionadded:: 1.1.0
:attr:`shadow_offset` is an :class:`~kivy.properties.ListProperty`
and defaults to `[0, 0]`.
"""
Te6edf3elevation Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0Tb4b4b4)
T8b949e"""
See :attr:`kivymd.uix.behaviors.CommonElevationBehavior.elevation`
attribute.
:attr:`elevation` is an :class:`~kivy.properties.NumericProperty`
and defaults to `0`.
"""
Te6edf3indicator_color Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
T8b949e"""
Color indicator in (r, g, b, a) or string format.
:attr:`indicator_color` is an :class:`~kivy.properties.ColorProperty`
and defaults to `None`.
"""
Te6edf3lock_swiping Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72FalseTb4b4b4)
T8b949e"""
If True - disable switching tabs by swipe.
:attr:`lock_swiping` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `False`.
"""
Te6edf3font_name Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff"Ta5d6ffRobotoTa5d6ff"Tb4b4b4)
T8b949e"""
Font name for tab text.
:attr:`font_name` is an :class:`~kivy.properties.StringProperty`
and defaults to `'Roboto'`.
"""
Te6edf3ripple_duration Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff2Tb4b4b4)
T8b949e"""
Ripple duration when long touching to tab.
:attr:`ripple_duration` is an :class:`~kivy.properties.NumericProperty`
and defaults to `2`.
"""
Te6edf3no_ripple_effect Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72TrueTb4b4b4)
T8b949e"""
Whether to use the ripple effect when tapping on a tab.
:attr:`no_ripple_effect` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `True`.
"""
Te6edf3title_icon_mode Tff7b72= Te6edf3OptionPropertyTb4b4b4(Ta5d6ff"Ta5d6ffLeadTa5d6ff"Tb4b4b4, Te6edf3optionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffLeadTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTopTa5d6ff"Tb4b4b4]Tb4b4b4)
T8b949e"""
This property sets the mode in wich the tab's title and icon are shown.
:attr:`title_icon_mode` is an :class:`~kivy.properties.OptionProperty`
and defaults to `'Lead'`.
"""
Te6edf3force_title_icon_mode Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72TrueTb4b4b4)
T8b949e"""
If this property is se to `True`, it will force the class to update every
tab inside the scroll view to the current `title_icon_mode`
:attr:`force_title_icon_mode` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `True`.
"""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffregister_event_typeTb4b4b4(Ta5d6ff"Ta5d6ffon_tab_switchTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffregister_event_typeTb4b4b4(Ta5d6ff"Ta5d6ffon_ref_pressTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffregister_event_typeTb4b4b4(Ta5d6ff"Ta5d6ffon_slide_progressTa5d6ff"Tb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_carousel_bindTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftheme_clsTff7b72.Td2a8ffbindTb4b4b4(
Te6edf3primary_paletteTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_icon_colorTb4b4b4,
Te6edf3theme_styleTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_icon_colorTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbindTb4b4b4(
Te6edf3force_title_icon_modeTff7b72=Tff7b72selfTff7b72.Td2a8ff_parse_icon_modeTb4b4b4,
Te6edf3title_icon_modeTff7b72=Tff7b72selfTff7b72.Td2a8ff_parse_icon_modeTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbindTb4b4b4(Te6edf3tab_hint_xTff7b72=Tff7b72selfTff7b72.Td2a8ff_update_tab_hint_xTb4b4b4)
Tff7b72def Td2a8ffupdate_icon_colorTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3instance_theme_managerTb4b4b4: Te6edf3ThemeManagerTb4b4b4,
Te6edf3name_theme_style_name_paletteTb4b4b4: Tffa657strTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
Called when the app's color scheme or style has changed
(dark theme/light theme).
"""
Tff7b72for Te6edf3tab_label Tff7b72in Tff7b72selfTff7b72.Td2a8ffget_tab_listTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftext_color_normalTb4b4b4:
Te6edf3tab_labelTff7b72.Td2a8fftext_color_normal Tff7b72= Tff7b72selfTff7b72.Td2a8fftheme_clsTff7b72.Td2a8fftext_color
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftext_color_activeTb4b4b4:
Te6edf3tab_labelTff7b72.Td2a8fftext_color_active Tff7b72= Tff7b72selfTff7b72.Td2a8ffspecific_secondary_text_color
Tff7b72def Td2a8ffswitch_tabTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3name_tabTb4b4b4: Te6edf3UnionTb4b4b4[Te6edf3MDTabsLabelTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4, Te6edf3search_byTff7b72=Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e"""
This method switch between tabs
name_tab can be either a String or a :class:`~MDTabsBase`.
`search_by` will look up through the properties of every tab.
If the value doesnt match, it will raise a ValueError.
Search_by options:
text : will search by the raw text of the label (`tab_label_text`)
icon : will search by the `icon` property
title : will search by the `title` property
"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3name_tabTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3search_by Tff7b72== Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4:
Tff7b72for Te6edf3tab_instance Tff7b72in Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffparentTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffslidesTb4b4b4:
Tff7b72if Te6edf3tab_instanceTff7b72.Td2a8fftitle_is_capital Tff7b72is Tff7b72TrueTb4b4b4:
Te6edf3_name_tab Tff7b72= Te6edf3name_tabTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3_name_tab Tff7b72= Te6edf3name_tab
Tff7b72if Te6edf3tab_instanceTff7b72.Td2a8fftitle Tff7b72== Te6edf3_name_tabTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffload_slideTb4b4b4(Te6edf3tab_instanceTb4b4b4)
Tff7b72return
T8b949e# Search by icon.
Tff7b72elif Te6edf3search_by Tff7b72== Ta5d6ff"Ta5d6fficonTa5d6ff"Tb4b4b4:
Tff7b72for Te6edf3tab_instance Tff7b72in Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffparentTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffslidesTb4b4b4:
Tff7b72if Te6edf3tab_instanceTff7b72.Td2a8fficon Tff7b72== Te6edf3name_tabTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffload_slideTb4b4b4(Te6edf3tab_instanceTb4b4b4)
Tff7b72return
T8b949e# Search by title.
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3tab_instance Tff7b72in Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffparentTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffslidesTb4b4b4:
Tff7b72if Te6edf3tab_instanceTff7b72.Td2a8fftab_label_text Tff7b72== Te6edf3name_tabTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffload_slideTb4b4b4(Te6edf3tab_instanceTb4b4b4)
Tff7b72return
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6ffswitch_tab:Tffea00\nTffea00\tTa5d6ff"
Ta5d6ff"Ta5d6ffname_tab not found in the tab listTffea00\nTffea00\tTa5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffsearch_by = Tffd700{Tffa657reprTb4b4b4(Te6edf3search_byTb4b4b4)Tffd700}Ta5d6ff Tffea00\nTffea00\tTa5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffname_tab = Tffd700{Tffa657reprTb4b4b4(Te6edf3name_tabTb4b4b4)Tffd700}Ta5d6ff Tffea00\nTffea00\tTa5d6ff"
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffload_slideTb4b4b4(Te6edf3name_tabTff7b72.Td2a8fftabTb4b4b4)
Tff7b72def Td2a8ffget_tab_listTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
T8b949e"""Returns a list of :class:`~MDTabsLabel` objects."""
Tff7b72return Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8fflayoutTff7b72.Td2a8ffchildrenTb4b4b4[Tb4b4b4:Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72def Td2a8ffget_slidesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
T8b949e"""Returns a list of user tab objects."""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffslides
Tff7b72def Td2a8ffget_current_tabTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
Returns current tab object.
.. versionadded:: 1.0.0
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffcurrent_slide
Tff7b72def Td2a8ffadd_widgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3widgetTb4b4b4, Te6edf3indexTff7b72=T79c0ff0Tb4b4b4, Te6edf3canvasTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e# You can add only subclass of MDTabsBase.
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3widgetTb4b4b4, Tb4b4b4(Te6edf3MDTabsBaseTb4b4b4, Te6edf3MDTabsMainTb4b4b4, Te6edf3MDTabsBarTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffMDTabs[Tffd700{Tff7b72selfTff7b72.Td2a8ffuidTffd700}Ta5d6ff].add_widget:Tffea00\nTffea00\tTa5d6ff"
Ta5d6ff"Ta5d6ffThe widget provided is not a subclass of MDTabsBase.Ta5d6ff"
Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchildrenTb4b4b4) Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# FIXME: Can't set the value of the `no_ripple_effect`
T8b949e# and `ripple_duration` properties for widget.tab_label.
Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ff_no_ripple_effect Tff7b72= Tff7b72selfTff7b72.Td2a8ffno_ripple_effect
Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ffripple_duration_in_slow Tff7b72= Tff7b72selfTff7b72.Td2a8ffripple_duration
Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ffgroup Tff7b72= Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8fftab_bar Tff7b72= Tff7b72selfTff7b72.Td2a8fftab_bar
Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8fffont_name Tff7b72= Tff7b72selfTff7b72.Td2a8fffont_name
Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8fftext_color_normal Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftext_color_normal
Tff7b72if Tff7b72selfTff7b72.Td2a8fftext_color_normal
Tff7b72else Tff7b72selfTff7b72.Td2a8ffspecific_secondary_text_color
Tb4b4b4)
Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8fftext_color_active Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftext_color_active
Tff7b72if Tff7b72selfTff7b72.Td2a8fftext_color_active
Tff7b72else Tff7b72selfTff7b72.Td2a8ffspecific_text_color
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbindTb4b4b4(
Te6edf3allow_stretchTff7b72=Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ff_update_text_sizeTb4b4b4,
Te6edf3fixed_tab_label_widthTff7b72=Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ff_update_text_sizeTb4b4b4,
Te6edf3font_nameTff7b72=Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ffsetterTb4b4b4(Ta5d6ff"Ta5d6fffont_nameTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3text_color_activeTff7b72=Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ffsetterTb4b4b4(
Ta5d6ff"Ta5d6fftext_color_activeTa5d6ff"
Tb4b4b4)Tb4b4b4,
Te6edf3text_color_normalTff7b72=Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ffsetterTb4b4b4(
Ta5d6ff"Ta5d6fftext_color_normalTa5d6ff"
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Te6edf3widgetTff7b72.Td2a8fftab_labelTff7b72.Td2a8ff_update_text_sizeTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8fflayoutTff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3widgetTff7b72.Td2a8fftab_labelTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3widgetTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffforce_title_icon_mode Tff7b72is Tff7b72TrueTb4b4b4:
Te6edf3widgetTff7b72.Td2a8fftitle_icon_mode Tff7b72= Tff7b72selfTff7b72.Td2a8fftitle_icon_mode
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ff_label_request_indicator_updateTb4b4b4, T79c0ff0
Tb4b4b4)
Tff7b72return
Tff7b72except Tf85149AttributeErrorTb4b4b4:
Tff7b72pass
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3widgetTb4b4b4, Tb4b4b4(Te6edf3MDTabsMainTb4b4b4, Te6edf3MDTabsBarTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3widgetTb4b4b4)
Tff7b72def Td2a8ffremove_widgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3widgetTb4b4b4)Tb4b4b4:
T8b949e# You can remove only subclass of MDTabsLabel or MDTabsBase.
Tff7b72if Tff7b72not Tffa657issubclassTb4b4b4(Te6edf3widgetTff7b72.Td2a8ff__class__Tb4b4b4, Tb4b4b4(Te6edf3MDTabsLabelTb4b4b4, Te6edf3MDTabsBaseTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3MDTabsExceptionTb4b4b4(
Ta5d6ff"Ta5d6ffMDTabs can remove only subclass of MDTabsLabel or MDTabsBaseTa5d6ff"
Tb4b4b4)
T8b949e# If the widget is an instance of MDTabsBase, then the widget is
T8b949e# set as the widget's tab_label object.
Tff7b72if Tffa657issubclassTb4b4b4(Te6edf3widgetTff7b72.Td2a8ff__class__Tb4b4b4, Te6edf3MDTabsBaseTb4b4b4)Tb4b4b4:
Te6edf3slide Tff7b72= Te6edf3widget
Te6edf3title_label Tff7b72= Te6edf3widgetTff7b72.Td2a8fftab_label
Tff7b72elseTb4b4b4:
T8b949e# We already got the label, so we set the slide reference.
Te6edf3slide Tff7b72= Te6edf3widgetTff7b72.Td2a8fftab
Te6edf3title_label Tff7b72= Te6edf3widget
T8b949e# Set memory.
T8b949e# Search object next tab.
T8b949e# Clean all bindings to allow the widget to be collected.
Tff7b72selfTff7b72.Td2a8ffunbindTb4b4b4(
Te6edf3allow_stretchTff7b72=Te6edf3title_labelTff7b72.Td2a8ff_update_text_sizeTb4b4b4,
Te6edf3fixed_tab_label_widthTff7b72=Te6edf3title_labelTff7b72.Td2a8ff_update_text_sizeTb4b4b4,
Te6edf3font_nameTff7b72=Te6edf3title_labelTff7b72.Td2a8ffsetterTb4b4b4(Ta5d6ff"Ta5d6fffont_nameTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3text_color_activeTff7b72=Te6edf3title_labelTff7b72.Td2a8ffsetterTb4b4b4(Ta5d6ff"Ta5d6fftext_color_activeTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3text_color_normalTff7b72=Te6edf3title_labelTff7b72.Td2a8ffsetterTb4b4b4(Ta5d6ff"Ta5d6fftext_color_normalTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffremove_widgetTb4b4b4(Te6edf3slideTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8fflayoutTff7b72.Td2a8ffremove_widgetTb4b4b4(Te6edf3title_labelTb4b4b4)
T8b949e# Clean the references.
Te6edf3slide Tff7b72= Tff7b72None
Te6edf3title_label Tff7b72= Tff7b72None
Te6edf3widget Tff7b72= Tff7b72None
Tff7b72def Td2a8ffon_slide_progressTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
This event is deployed every available frame while the tab is scrolling.
"""
Tff7b72def Td2a8ffon_carousel_indexTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3instance_tabs_carouselTb4b4b4, Te6edf3indexTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
Called when the Tab index have changed.
This event is deployed by the built in carousel of the class.
"""
T8b949e# When the index of the carousel change, update tab indicator,
T8b949e# select the current tab and reset threshold data.
Tff7b72if Te6edf3instance_tabs_carouselTff7b72.Td2a8ffcurrent_slideTb4b4b4:
Te6edf3current_tab_label Tff7b72= Te6edf3instance_tabs_carouselTff7b72.Td2a8ffcurrent_slideTff7b72.Td2a8fftab_label
Tff7b72if Te6edf3current_tab_labelTff7b72.Td2a8ffstate Tff7b72== Ta5d6ff"Ta5d6ffnormalTa5d6ff"Tb4b4b4:
T8b949e# current_tab_label._do_press()
Te6edf3current_tab_labelTff7b72.Td2a8ffdispatchTb4b4b4(Ta5d6ff"Ta5d6ffon_releaseTa5d6ff"Tb4b4b4)
Te6edf3current_tab_labelTff7b72.Td2a8ff_release_groupTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3current_tab_labelTff7b72.Td2a8ffstate Tff7b72= Ta5d6ff"Ta5d6ffdownTa5d6ff"
Tff7b72if Tff7b72selfTff7b72.Td2a8fftab_indicator_type Tff7b72== Ta5d6ff"Ta5d6ffroundTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_indicator_height Tff7b72= Tff7b72selfTff7b72.Td2a8fftab_bar_height
Tff7b72if Te6edf3index Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3radius Tff7b72= Tb4b4b4[
T79c0ff0Tb4b4b4,
Tff7b72selfTff7b72.Td2a8fftab_bar_height Tff7b72/ T79c0ff2Tb4b4b4,
Tff7b72selfTff7b72.Td2a8fftab_bar_height Tff7b72/ T79c0ff2Tb4b4b4,
T79c0ff0Tb4b4b4,
Tb4b4b4]
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffupdate_indicatorTb4b4b4(
Te6edf3current_tab_labelTff7b72.Td2a8ffxTb4b4b4, Te6edf3current_tab_labelTff7b72.Td2a8ffwidthTb4b4b4, Te6edf3radius
Tb4b4b4)
Tff7b72elif Te6edf3index Tff7b72== Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_tab_listTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4:
Te6edf3radius Tff7b72= Tb4b4b4[
Tff7b72selfTff7b72.Td2a8fftab_bar_height Tff7b72/ T79c0ff2Tb4b4b4,
T79c0ff0Tb4b4b4,
T79c0ff0Tb4b4b4,
Tff7b72selfTff7b72.Td2a8fftab_bar_height Tff7b72/ T79c0ff2Tb4b4b4,
Tb4b4b4]
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffupdate_indicatorTb4b4b4(
Te6edf3current_tab_labelTff7b72.Td2a8ffxTb4b4b4, Te6edf3current_tab_labelTff7b72.Td2a8ffwidthTb4b4b4, Te6edf3radius
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3radius Tff7b72= Tb4b4b4[
Tff7b72selfTff7b72.Td2a8fftab_bar_height Tff7b72/ T79c0ff2Tb4b4b4,
Tb4b4b4]
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffupdate_indicatorTb4b4b4(
Te6edf3current_tab_labelTff7b72.Td2a8ffxTb4b4b4, Te6edf3current_tab_labelTff7b72.Td2a8ffwidthTb4b4b4, Te6edf3radius
Tb4b4b4)
Tff7b72elif Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftab_indicator_type Tff7b72== Ta5d6ff"Ta5d6fffillTa5d6ff"
Tff7b72or Tff7b72selfTff7b72.Td2a8fftab_indicator_type Tff7b72== Ta5d6ff"Ta5d6ffline-roundTa5d6ff"
Tff7b72or Tff7b72selfTff7b72.Td2a8fftab_indicator_type Tff7b72== Ta5d6ff"Ta5d6ffline-rectTa5d6ff"
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_indicator_height Tff7b72= Tff7b72selfTff7b72.Td2a8fftab_bar_height
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffupdate_indicatorTb4b4b4(
Te6edf3current_tab_labelTff7b72.Td2a8ffxTb4b4b4, Te6edf3current_tab_labelTff7b72.Td2a8ffwidth
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffupdate_indicatorTb4b4b4(
Te6edf3current_tab_labelTff7b72.Td2a8ffxTb4b4b4, Te6edf3current_tab_labelTff7b72.Td2a8ffwidth
Tb4b4b4)
Tff7b72def Td2a8ffon_ref_pressTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
This event will be launched every time the user press a markup enabled
label with a link or reference inside.
"""
Tff7b72def Td2a8ffon_tab_switchTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""This event is launched every time the current tab is changed."""
Tff7b72def Td2a8ffon_sizeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3instance_tabTb4b4b4, Te6edf3sizeTb4b4b4: Tffa657listTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Called when the application screen is resized."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffcurrent_slideTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_update_indicatorTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffcurrent_slideTff7b72.Td2a8fftab_labelTb4b4b4)
Tff7b72def Td2a8ff_update_tab_hint_xTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8fflayoutTff7b72.Td2a8ffchildrenTb4b4b4:
Tff7b72return
Tff7b72if Tff7b72selfTff7b72.Td2a8fftab_hint_x Tff7b72is Tff7b72TrueTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffixed_tab_label_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72/Tff7b72/ Tffa657lenTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8fflayoutTff7b72.Td2a8ffchildren
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffallow_stretch Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallow_stretch Tff7b72= Tff7b72True
Tff7b72def Td2a8ff_parse_icon_modeTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffforce_title_icon_mode Tff7b72is Tff7b72TrueTb4b4b4:
Tff7b72for Te6edf3slide Tff7b72in Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffslidesTb4b4b4:
Te6edf3slideTff7b72.Td2a8fftitle_icon_mode Tff7b72= Tff7b72selfTff7b72.Td2a8fftitle_icon_mode
Tff7b72if Tff7b72selfTff7b72.Td2a8fftitle_icon_mode Tff7b72== Ta5d6ff"Ta5d6ffTopTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_bar_height Tff7b72= Te6edf3dpTb4b4b4(T79c0ff72Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_bar_height Tff7b72= Te6edf3dpTb4b4b4(T79c0ff48Tb4b4b4)
Tff7b72def Td2a8ff_carousel_bindTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3intervalTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_slide_progressTff7b72=Tff7b72selfTff7b72.Td2a8ff_on_slide_progressTb4b4b4)
Tff7b72def Td2a8ff_on_slide_progressTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdispatchTb4b4b4(Ta5d6ff"Ta5d6ffon_slide_progressTa5d6ff"Tb4b4b4, Te6edf3argsTb4b4b4)
Tff7b72def Td2a8ff_update_indicatorTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3current_tab_labelTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffupdate_indicatorTb4b4b4(Te6edf3intervalTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8ffupdate_indicatorTb4b4b4(
Te6edf3current_tab_labelTff7b72.Td2a8ffxTb4b4b4, Te6edf3current_tab_labelTff7b72.Td2a8ffwidth
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3current_tab_labelTb4b4b4:
Te6edf3current_tab_label Tff7b72= Tff7b72selfTff7b72.Td2a8fftab_barTff7b72.Td2a8fflayoutTff7b72.Td2a8ffchildrenTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Te6edf3update_indicatorTb4b4b4)
Tff7b72def Td2a8ff_update_paddingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3layoutTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftab_hint_x Tff7b72is Tff7b72TrueTb4b4b4:
Te6edf3layoutTff7b72.Td2a8ffpadding Tff7b72= Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4]
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_update_tab_hint_xTb4b4b4)
Tff7b72return Tff7b72True
Te6edf3padding Tff7b72= Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4]
T8b949e# FIXME: It's not entirely clear why the `padding = [dp (52), 0]`
T8b949e# instruction is needed? This creates an extra 52px left padding and
T8b949e# looks like a bug. This instruction was added by the contributors in
T8b949e# previous commits and I have not yet figured out why this was done.
T8b949e# This is more efficient than to use sum([layout.children]).
T8b949e# width = layout.width - (layout.padding[0] * 2)
T8b949e# Forces the padding of the tab_bar when the tab_bar is scrollable.
T8b949e# if width > self.width:
T8b949e# padding = [dp(52), 0]
T8b949e# Set the new padding.
Te6edf3layoutTff7b72.Td2a8ffpadding Tff7b72= Te6edf3padding
T8b949e# Update the indicator.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffcurrent_slideTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_update_indicatorTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffcurrent_slideTff7b72.Td2a8fftab_labelTb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(
Tff7b72lambda Te6edf3xTb4b4b4: Tffa657setattrTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffcarouselTff7b72.Td2a8ffcurrent_slideTff7b72.Td2a8fftab_labelTb4b4b4, Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdownTa5d6ff"
Tb4b4b4)Tb4b4b4,
Tff7b72-T79c0ff1Tb4b4b4,
Tb4b4b4)
Tff7b72return Tff7b72True
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────